import subprocess
from mcp.server.fastmcp import FastMCP
from dotenv import load_dotenv
import os

load_dotenv()  # 加载 .env 文件

DELL_USERNAME = os.getenv("DELL_USERNAME")
DELL_PASSWORD = os.getenv("DELL_PASSWORD")


def check_host_power_status(bmc_ip, username, password):
    """
    检查主机的电源状态
    
    :param bmc_ip: BMC 的 IP 地址
    :param username: BMC 的用户名
    :param password: BMC 的密码
    :return: 主机的电源状态（True 表示已开机，False 表示已关机）
    """
    command = [
        "ipmitool",
        "-I", "lanplus",
        "-H", bmc_ip,
        "-U", username,
        "-P", password,
        "power", "status"
    ]
    try:
        result = subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        if "on" in result.stdout.lower():
            return True
        else:
            return False
    except subprocess.CalledProcessError as e:
        return f"检查主机电源状态时发生错误: {e.stderr}"

def power_on_host_command(bmc_ip, username, password):
    """
    开启 ESXi 主机的电源
    
    :param bmc_ip: BMC 的 IP 地址
    :param username: BMC 的用户名
    :param password: BMC 的密码
    :return: 布尔值，表示是否成功开启主机电源
    """
    command = [
        "ipmitool",
        "-I", "lanplus",
        "-H", bmc_ip,
        "-U", username,
        "-P", password,
        "power", "on"
    ]
    try:
        result = subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        return "主机已成功开启"
    except subprocess.CalledProcessError as e:
        return f"开启主机时发生错误: {e.stderr}"

def power_on_host(bmc_ip: str):
    """
    MCP工具函数：安全开启指定BMC主机电源
    
    参数:
        bmc_ip (str): BMC控制器的IP地址，用于远程电源管理
        
    返回:
        str: 操作结果消息，可能包含以下几种情况:
            - 主机已开机，无需执行开机操作
            - 主机开机成功消息
            - 检查电源状态时的错误信息
            - 执行开机命令时的错误信息
            
    处理流程:
        1. 首先检查主机当前电源状态
        2. 如果主机已开机，返回提示信息
        3. 如果主机已关机，执行开机命令
        4. 返回操作结果
        
    注意事项:
        - 使用DELL_USERNAME和DELL_PASSWORD环境变量作为BMC认证凭据
        - 依赖ipmitool工具执行远程电源管理命令
        - 错误信息会直接返回给调用方
    """
    power_status = check_host_power_status(bmc_ip, DELL_USERNAME, DELL_PASSWORD)
    if isinstance(power_status, str):
        # 出错信息
        return power_status
    if power_status:
        return "主机已开机，无需执行开机操作"
    else:
        return power_on_host_command(bmc_ip, DELL_USERNAME, DELL_PASSWORD)


